#!/bin/bash
#set -x

##使用说明
##将rsapp-check.sh脚本文件跟后端组件放在相同目录，通常是/data/app目录，如果目录有变化加入计划任务时请修改路径
##后端组件必须包含‘nsrep-’前缀，不需要检测的组件不要跟rsapp-check.sh放在同一目录
##执行命令把脚本文件加入计划任务: echo "*/5 * * * * bash /data/app/rsapp-check.sh" >>/var/spool/cron/root

. /etc/profile
# get app list
APP_PATH=`cd $(dirname $0);pwd`
cd $APP_PATH
#可以通过ls产生目录列表，也可以注释后手动编辑文件内容
ls -1 |grep '^nsrep-' | egrep -v "nsrep-check-runner" |sort -u >/opt/app_list

#检查组件是否运行
rm -rf /opt/app_fail
for i in $(cat /opt/app_list); do 
my_pid=$(systemctl status $i|awk '/Main PID/{print $3}')
 if test -n $my_pid; then
  #检查端口是否监听,若监听就获取端口
  port_count=$(ss -tulnp|grep pid=$my_pid|awk '/tcp/'|egrep -v '9001|55555|12325'|wc -l)
  if test ${port_count} != '1';
  then
    echo $i>>/opt/app_fail
  else
    #请求端口获取组件info信息，有返回表示组件正常
    port_tcp=$(ss -tulnp|grep pid=$my_pid|awk '/tcp/{print $5}'|awk -F: '!/9001/&&!/55555/&&!/12325/{print $NF}')
    curl --max-time 60 --retry 3 -sf http://localhost:$port_tcp/actuator/info >/dev/null
    if [ $? != '0' ]; 
    then
      echo $i>>/opt/app_fail
    fi
  fi
 else
  echo $i>>/opt/app_fail
 fi
done

#重启不正常的组件
if test -e /opt/app_fail;
then
  for i in $(cat /opt/app_fail|sort -u); do 
  systemctl restart $i
  echo $i
  logger -t "rsapp_restart..." $i
  done
fi

